#pragma once

#include "../Headers/types.h"
#include "../Headers/log.h"

#include "../NS/nameserver.h"

#include "ws.client.h"
#include "ws.packer.h"
#include "ws.functions.h"

#include <string>
#include <cstring>

namespace TOB {
  namespace WS {
  
    class UnpackerException {
    public:
      /**
       * Обработчик исключительной ситуации, выводит сообщение об ошибке
       * @param error строка ошибки
       */
      UnpackerException(std::string error);
    };
    
    class Unpacker {
    private:
      TOB::WS::Function::Type _func;
      TOB::WS::Data _data;
      std::string _request;
      std::string _username;
      std::string _password;
      TOB::Nameserver::IP _nsip;
    public:
      /**
       * Распаковка данных от упаковщика
       * @param packer объект упаковщика
       */
      Unpacker(TOB::WS::Packer& packer);
      /**
       * Создание объекта с пустыми данными
       */
      Unpacker();
      /**
       * Удаление объекта и отчистка памяти
       */
      ~Unpacker();
      /**
       * Получить данные хранящиеся в распаковщике
       * @return данные
       */
      TOB::WS::Data& getData();
      /**
       * Получить IP неймсервера
       * @return IP неймсервера
       */
      TOB::Nameserver::IP getNSIP();
      /**
       * Получить запрос
       * @return запрос
       */
      std::string getRequest();
      /**
       * Получить имя пользователя
       * @return имя пользователя
       */
      std::string getUsername();
      /**
       * Получить пароль
       * @return пароль
       */
      std::string getPassword();
      /**
       * Получить функцию, которая должна быть выполнена
       * @return функция
       */
      TOB::WS::Function::Type& getFunc();
    };
  }
}
